昨天我們認識了 Kustomize 這個 Kubernetes 原生的配置管理工具。從實際的痛點出發,了解到當需要在多個環境部署相同應用時,複製和維護多份 YAML 檔案會造成管理上的困難。Kustomize 透過 Base 和 Overlays 的概念解決了這個問題,讓我們能夠重複使用基礎配置,只針對不同環境修改需要變更的部分。
昨天我們只看了 Kustomize
的基礎功能。今天我們將深入研究 Kustomize
真正強大的地方:Transformers 和 Patches。這些進階功能讓我們能夠精確地修改資源配置、管理不同環境的映像檔版本、建立可重用的配置片段,真正發揮 Kustomize 在多環境部署管理上的威力。
根據你的要求,我重新整理 Transformers 的部分,將 Common Transformers 和 Image Transformers 合併成一個章節:
Transformers 是 Kustomize 提供的統一修改機制,讓我們能夠對多個資源進行批次性的配置調整,而不需要逐一修改每個 YAML 檔案。
當我們需要對所有 Kubernetes 資源進行統一的配置修改時,Common Transformers 就是最佳選擇。比如說,我們想為所有資源加上公司的標籤、統一 Namespace、或是添加共同的前綴後綴,這些都可以透過 Transformers 輕鬆完成。
Kustomize 提供了幾種常用的 Transformers:
這些 Transformers 的強大之處在於作用範圍。如果在根目錄的 kustomization.yaml
中定義時,它會影響所有被引入的資源;而如果在子目錄中定義時,則只會影響該目錄下的資源。這種階層式的設計讓配置管理變得非常靈活。
Image Transformers 專門用來管理容器映像檔的版本和來源。在不同環境中,我們經常需要使用不同版本的映像檔,或是從不同的 Registry 拉取映像檔。
透過指定 name
和 newName
,可以替換所有使用特定映像檔的容器。如果只想更新標籤,可以使用 newTag
屬性。這在升級應用版本或是回滾時特別有用,不需要修改任何 YAML 檔配置,只要在 kustomization.yaml
中調整映像檔設定即可。
值得注意的是,Image Transformer 是根據映像檔名稱來匹配的,而不是容器名稱。它會掃描所有資源,找出使用指定映像檔的容器並進行替換,因此若是在根目錄使用的話需要特別注意。
Patches 提供了更精確的修改方式。不同於 Common Transformers 的全域修改,Patches 是直接針對特定的資源進行修改。
JSON 6902 Patch 遵循 RFC 6902 標準,使用操作指令來修改資源。每個 Patch 需要三個要素:operation(操作類型:add、remove、replace)、target(目標資源的識別條件)、以及 value(要設定的值,remove 操作不需要)。
# 修改 replicas
patches:
- target:
kind:: Deployment
name: api-deployment
patch: |-
- op: replace
path: /spec/replicas
value: 5
# 修改 Container Image
patches:
- target:
kind:: Deployment
name: api-deployment
patch: |-
- op: replace
path: /spec/template/spec/containers/0
value:
name: haproxy
image: haproxy
路徑的指定是關鍵,可以看到上方的 YAML 配置。比如要修改 deployment 中的 replicas,路徑會是 /spec/replicas
。對於列表類型的資源,需要使用索引來指定位置,例如 /spec/template/spec/containers/0
代表第一個容器。
Strategic Merge Patch 的方式更直觀。你只需要寫出想要修改的部分 YAML,Kustomize 會智慧地將它與原始配置合併。這種方式的好處是可讀性高,因為它就是標準的 Kubernetes YAML。
# 修改 replicas
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 5
# 修改 Container Image
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
template:
spec:
containers:
- name: haproxy
image: haproxy
可以參考上方 YAML,對於字典類型的資源,Strategic Merge Patch 會合併鍵值對。如果要刪除某個鍵,需要將值設為 null
。對於列表類型的資源,如果要刪除某個項目,需要使用特殊的 $patch: delete
指令。
Overlays 是 Kustomize 實現多環境管理的核心機制。透過在不同的 overlay 目錄中定義環境特定的 patches 和額外資源,我們可以從同一個 base 配置衍生出適合不同環境的配置。
每個 overlay 都有自己的 kustomization.yaml
,其中透過 bases
屬性引用 base 配置,然後定義該環境特有的修改。這不僅限於 patches,你也可以在 overlay 中加入該環境獨有的資源,如下方 YAML 配置,比如只在生產環境中啟用的監控元件。
bases:
- ../../base
resources:
- grafana.deployment.yaml
patch: |-
- op: replace
path: /spec/replicas
value: 5
Components 是 Kustomize 中較新的功能,它解決了「某些功能只在部分環境中啟用」的問題。比如快取功能只在生產和預發布環境啟用,而開發環境不需要。如果把它放在 base 中,所有環境都會有;如果複製到各個 overlay 中,又違反了 DRY(Don't Repeat Yourself)
原則。
Components 提供了第三種選擇:將這些可選功能打包成獨立的元件,然後在需要的 overlay 中引用。一個 Component 可以包含資源、patches、secrets 等所有相關配置。透過在 overlay 的 kustomization.yaml
中列出需要的 components,就能靈活地組合功能,如下方 YAML。
# components/db/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
resources:
- postgres-depl.yaml
secretGenerator:
- name: postgres-cred
literals:
- password=postgres123
patches:
- deployment-path.yaml
# components/db/deployment-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-Deployment
spec:
template:
spec:
containers:
- name: api
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-cred
key: password
# overlays/prod/kustomization.yaml
bases:
- ../../base
components:
- ../../components/db
稍後補上,先發文!